"""
进程相关：是操作系统分配资源的基本单位
优缺点？什么场景下使用？
"""
import multiprocessing as mp
import os
import time
from time import sleep

"""
1.多进程执行
2.获取进程对象：mp.current_process()
    为什么子进程对象mp.current_process() 都是一个值？为什么主进程对象parent=None
3.获取进程名：mp.current_process().name
    默认名字是Process-X
4.获取进程id: os.getpid() / os.getppid()
"""
def task1():
    for i in range(10):
        print(f"Take 1 Run 第 {i}个，进程名：{mp.current_process().name} ",mp.current_process())
        print(f"{mp.current_process().name}_ID",os.getpid())
        print(f"{mp.current_process().name}_Parent_ID", os.getppid())


def task2():
    for i in range(10):
        print(f"Take 2 Run 第 {i}个，进程名：{mp.current_process().name} ",mp.current_process())
        sleep(1)
        print(f"{mp.current_process().name}_ID",os.getpid())
        print(f"{mp.current_process().name}_Parent_ID", os.getppid())

def task():
    for i in range(10):
        if mp.current_process().name == "Process-1":
            print(f"{mp.current_process().name}_ID", os.getpid())
            print(f"{mp.current_process().name}_Parent_ID", os.getppid())
            print("*"*30)
        else:
            print(f"{mp.current_process().name}_ID", os.getpid())
            print(f"{mp.current_process().name}_Parent_ID", os.getppid())
            print("*" * 30)
        time.sleep(0.2)
def task_tack_arg(n,msg):
    for i in range(n):
        if mp.current_process().name == "Process-1":
            print(mp.current_process().name,f"Task 1 -Run 第{i}次",msg)
        else:
            print(mp.current_process().name,f"Task 2 -Run 第{i}次", msg)
        time.sleep(0.2)
    return None


# 场景一：创建两个进程p1 p2 ，两个进程执行p1.start()，目前按照顺序执行的，先p1后p2，没有存在并发
def create_task():
    p1 = mp.Process(target=task1,name="majialu-1")
    p2 = mp.Process(target=task2)

    p1.start()
    p2.start()
    print(f"主进程的对象：{mp.current_process()}")

# 场景二：开两个进程Process-1 / Process-2，执行一个函数task
def create_task2():
    p1 = mp.Process(target=task)
    p2 = mp.Process(target=task)

    p1.start()
    p2.start()
    print(f"主进程的对象：{mp.current_process()}")
    print(f"{mp.current_process().name}_ID", os.getpid())
    print(f"{mp.current_process().name}_Parent_ID", os.getppid())

# 场景三：传参
def create_task3():
    p1 = mp.Process(target=task_tack_arg,args=(10,"巫明瑾"))
    p2 = mp.Process(target=task_tack_arg,kwargs={"msg":"mjialu","n":10})
    p1.start()
    p2.start()

# 场景四：进程同步（将异步变成同步：第2个进程的数据是第1个进程的返回值，就需要等进程1执行后再执行进程2）
def create_task4():
    p1 = mp.Process(target=task_tack_arg,args=(10,"巫明瑾"))
    p2 = mp.Process(target=task_tack_arg,kwargs={"msg":"mjialu","n":10})

    p1.start()
    p1.join()  # 进程1执行后，再执行进程2
    p2.start()
    p2.join() # 进程2执行后，再执行主进程
    print(f"*********main***********:{mp.current_process()}")

# 场景五：守护进程 2种方式 （网盘退出，下载的任务也被关闭 ==>无论子进程是否执行完毕，父进程结束的时候，子进程直接结束）
def create_task5():
    p1 = mp.Process(target=task1, name="majialu-1")
    p2 = mp.Process(target=task2)
    print(f"main:{mp.current_process()}")

    # p1.daemon = True  # 方式1 主进程执行后，自动杀死
    # p2.daemon = True
    p1.start()
    p2.start()
    time.sleep(1)

    p1.terminate() # 方式2 手动杀死
    p2.terminate()
    print("main over")

# 场景六： 进程不共享全局变量 （）

if __name__ == '__main__':

    # create_task() # 先p1后p2，没有存在并发
    # create_task2()
    # create_task3()
    # create_task4()
    create_task5()






















